import { AlbumManager } from "./AlbumManager/AlbumManager";
import { AppConfig } from "./AppConfig";
import { AudioManager } from "./AudioManager/AudioManager";
import { Const } from "./Const";
import { DomainConfig } from "./DomainConfig";
import { HotUpdate } from "./HotUpdate/HotUpdate";
import { Language } from "./Language/Language";
import { LocalStorage } from "./LocalStorage/LocalStorage";
import { NativeNotification } from "./NativeNotification/NativeNotification";
import { NetManager } from "./Network/NetManager";
import { ProtoEnum } from "./ProtoEnum";
import { SocialManager } from "./SocialManager/SocialManager";
import { UserInfoManager } from "./UserInfoManager/UserInfoManager";
import { GEventManager } from "./Utils/GEventManager";
import { Utils } from "./Utils/Utils";
import { ScreenRotationCtrl } from "./View/ScreenRotationCtrl";
import { UiManager } from "./View/UiManager";

export enum JavaKeyCode {
    KEYCODE_0 = 7,
    KEYCODE_1 = 8,
    KEYCODE_11 = 227,
    KEYCODE_12 = 228,
    KEYCODE_2 = 9,
    KEYCODE_3 = 10,
    KEYCODE_3D_MODE = 206,
    KEYCODE_4 = 11,
    KEYCODE_5 = 12,
    KEYCODE_6 = 13,
    KEYCODE_7 = 14,
    KEYCODE_8 = 15,
    KEYCODE_9 = 16,
    KEYCODE_A = 29,
    KEYCODE_ALL_APPS = 284,
    KEYCODE_ALT_LEFT = 57,
    KEYCODE_ALT_RIGHT = 58,
    KEYCODE_APOSTROPHE = 75,
    KEYCODE_APP_SWITCH = 187,
    KEYCODE_ASSIST = 219,
    KEYCODE_AT = 77,
    KEYCODE_AVR_INPUT = 182,
    KEYCODE_AVR_POWER = 181,
    KEYCODE_B = 30,
    KEYCODE_BACK = 4,
    KEYCODE_BACKSLASH = 73,
    KEYCODE_BOOKMARK = 174,
    KEYCODE_BREAK = 121,
    KEYCODE_BRIGHTNESS_DOWN = 220,
    KEYCODE_BRIGHTNESS_UP = 221,
    KEYCODE_BUTTON_1 = 188,
    KEYCODE_BUTTON_10 = 197,
    KEYCODE_BUTTON_11 = 198,
    KEYCODE_BUTTON_12 = 199,
    KEYCODE_BUTTON_13 = 200,
    KEYCODE_BUTTON_14 = 201,
    KEYCODE_BUTTON_15 = 202,
    KEYCODE_BUTTON_16 = 203,
    KEYCODE_BUTTON_2 = 189,
    KEYCODE_BUTTON_3 = 190,
    KEYCODE_BUTTON_4 = 191,
    KEYCODE_BUTTON_5 = 192,
    KEYCODE_BUTTON_6 = 193,
    KEYCODE_BUTTON_7 = 194,
    KEYCODE_BUTTON_8 = 195,
    KEYCODE_BUTTON_9 = 196,
    KEYCODE_BUTTON_A = 96,
    KEYCODE_BUTTON_B = 97,
    KEYCODE_BUTTON_C = 98,
    KEYCODE_BUTTON_L1 = 102,
    KEYCODE_BUTTON_L2 = 104,
    KEYCODE_BUTTON_MODE = 110,
    KEYCODE_BUTTON_R1 = 103,
    KEYCODE_BUTTON_R2 = 105,
    KEYCODE_BUTTON_SELECT = 109,
    KEYCODE_BUTTON_START = 108,
    KEYCODE_BUTTON_THUMBL = 106,
    KEYCODE_BUTTON_THUMBR = 107,
    KEYCODE_BUTTON_X = 99,
    KEYCODE_BUTTON_Y = 100,
    KEYCODE_BUTTON_Z = 101,
    KEYCODE_C = 31,
    KEYCODE_CALCULATOR = 210,
    KEYCODE_CALENDAR = 208,
    KEYCODE_CALL = 5,
    KEYCODE_CAMERA = 27,
    KEYCODE_CAPS_LOCK = 115,
    KEYCODE_CAPTIONS = 175,
    KEYCODE_CHANNEL_DOWN = 167,
    KEYCODE_CHANNEL_UP = 166,
    KEYCODE_CLEAR = 28,
    KEYCODE_COMMA = 55,
    KEYCODE_CONTACTS = 207,
    KEYCODE_COPY = 278,
    KEYCODE_CTRL_LEFT = 113,
    KEYCODE_CTRL_RIGHT = 114,
    KEYCODE_CUT = 277,
    KEYCODE_D = 32,
    KEYCODE_DEL = 67,
    KEYCODE_DPAD_CENTER = 23,
    KEYCODE_DPAD_DOWN = 20,
    KEYCODE_DPAD_DOWN_LEFT = 269,
    KEYCODE_DPAD_DOWN_RIGHT = 271,
    KEYCODE_DPAD_LEFT = 21,
    KEYCODE_DPAD_RIGHT = 22,
    KEYCODE_DPAD_UP = 19,
    KEYCODE_DPAD_UP_LEFT = 268,
    KEYCODE_DPAD_UP_RIGHT = 270,
    KEYCODE_DVR = 173,
    KEYCODE_E = 33,
    KEYCODE_EISU = 212,
    KEYCODE_ENDCALL = 6,
    KEYCODE_ENTER = 66,
    KEYCODE_ENVELOPE = 65,
    KEYCODE_EQUALS = 70,
    KEYCODE_ESCAPE = 111,
    KEYCODE_EXPLORER = 64,
    KEYCODE_F = 34,
    KEYCODE_F1 = 131,
    KEYCODE_F10 = 140,
    KEYCODE_F11 = 141,
    KEYCODE_F12 = 142,
    KEYCODE_F2 = 132,
    KEYCODE_F3 = 133,
    KEYCODE_F4 = 134,
    KEYCODE_F5 = 135,
    KEYCODE_F6 = 136,
    KEYCODE_F7 = 137,
    KEYCODE_F8 = 138,
    KEYCODE_F9 = 139,
    KEYCODE_FOCUS = 80,
    KEYCODE_FORWARD = 125,
    KEYCODE_FORWARD_DEL = 112,
    KEYCODE_FUNCTION = 119,
    KEYCODE_G = 35,
    KEYCODE_GRAVE = 68,
    KEYCODE_GUIDE = 172,
    KEYCODE_H = 36,
    KEYCODE_HEADSETHOOK = 79,
    KEYCODE_HELP = 259,
    KEYCODE_HENKAN = 214,
    KEYCODE_HOME = 3,
    KEYCODE_I = 37,
    KEYCODE_INFO = 165,
    KEYCODE_INSERT = 124,
    KEYCODE_J = 38,
    KEYCODE_K = 39,
    KEYCODE_KANA = 218,
    KEYCODE_KATAKANA_HIRAGANA = 215,
    KEYCODE_L = 40,
    KEYCODE_LANGUAGE_SWITCH = 204,
    KEYCODE_LAST_CHANNEL = 229,
    KEYCODE_LEFT_BRACKET = 71,
    KEYCODE_M = 41,
    KEYCODE_MANNER_MODE = 205,
    KEYCODE_MEDIA_AUDIO_TRACK = 222,
    KEYCODE_MEDIA_CLOSE = 128,
    KEYCODE_MEDIA_EJECT = 129,
    KEYCODE_MEDIA_FAST_FORWARD = 90,
    KEYCODE_MEDIA_NEXT = 87,
    KEYCODE_MEDIA_PAUSE = 127,
    KEYCODE_MEDIA_PLAY = 126,
    KEYCODE_MEDIA_PLAY_PAUSE = 85,
    KEYCODE_MEDIA_PREVIOUS = 88,
    KEYCODE_MEDIA_RECORD = 130,
    KEYCODE_MEDIA_REWIND = 89,
    KEYCODE_MEDIA_SKIP_BACKWARD = 273,
    KEYCODE_MEDIA_SKIP_FORWARD = 272,
    KEYCODE_MEDIA_STEP_BACKWARD = 275,
    KEYCODE_MEDIA_STEP_FORWARD = 274,
    KEYCODE_MEDIA_STOP = 86,
    KEYCODE_MEDIA_TOP_MENU = 226,
    KEYCODE_MENU = 82,
    KEYCODE_META_LEFT = 117,
    KEYCODE_META_RIGHT = 118,
    KEYCODE_MINUS = 69,
    KEYCODE_MOVE_END = 123,
    KEYCODE_MOVE_HOME = 122,
    KEYCODE_MUHENKAN = 213,
    KEYCODE_MUSIC = 209,
    KEYCODE_MUTE = 91,
    KEYCODE_N = 42,
    KEYCODE_NAVIGATE_IN = 262,
    KEYCODE_NAVIGATE_NEXT = 261,
    KEYCODE_NAVIGATE_OUT = 263,
    KEYCODE_NAVIGATE_PREVIOUS = 260,
    KEYCODE_NOTIFICATION = 83,
    KEYCODE_NUM = 78,
    KEYCODE_NUMPAD_0 = 144,
    KEYCODE_NUMPAD_1 = 145,
    KEYCODE_NUMPAD_2 = 146,
    KEYCODE_NUMPAD_3 = 147,
    KEYCODE_NUMPAD_4 = 148,
    KEYCODE_NUMPAD_5 = 149,
    KEYCODE_NUMPAD_6 = 150,
    KEYCODE_NUMPAD_7 = 151,
    KEYCODE_NUMPAD_8 = 152,
    KEYCODE_NUMPAD_9 = 153,
    KEYCODE_NUMPAD_ADD = 157,
    KEYCODE_NUMPAD_COMMA = 159,
    KEYCODE_NUMPAD_DIVIDE = 154,
    KEYCODE_NUMPAD_DOT = 158,
    KEYCODE_NUMPAD_ENTER = 160,
    KEYCODE_NUMPAD_EQUALS = 161,
    KEYCODE_NUMPAD_LEFT_PAREN = 162,
    KEYCODE_NUMPAD_MULTIPLY = 155,
    KEYCODE_NUMPAD_RIGHT_PAREN = 163,
    KEYCODE_NUMPAD_SUBTRACT = 156,
    KEYCODE_NUM_LOCK = 143,
    KEYCODE_O = 43,
    KEYCODE_P = 44,
    KEYCODE_PAGE_DOWN = 93,
    KEYCODE_PAGE_UP = 92,
    KEYCODE_PAIRING = 225,
    KEYCODE_PASTE = 279,
    KEYCODE_PERIOD = 56,
    KEYCODE_PICTSYMBOLS = 94,
    KEYCODE_PLUS = 81,
    KEYCODE_POUND = 18,
    KEYCODE_POWER = 26,
    KEYCODE_PROFILE_SWITCH = 288,
    KEYCODE_PROG_BLUE = 186,
    KEYCODE_PROG_GREEN = 184,
    KEYCODE_PROG_RED = 183,
    KEYCODE_PROG_YELLOW = 185,
    KEYCODE_Q = 45,
    KEYCODE_R = 46,
    KEYCODE_REFRESH = 285,
    KEYCODE_RIGHT_BRACKET = 72,
    KEYCODE_RO = 217,
    KEYCODE_S = 47,
    KEYCODE_SCROLL_LOCK = 116,
    KEYCODE_SEARCH = 84,
    KEYCODE_SEMICOLON = 74,
    KEYCODE_SETTINGS = 176,
    KEYCODE_SHIFT_LEFT = 59,
    KEYCODE_SHIFT_RIGHT = 60,
    KEYCODE_SLASH = 76,
    KEYCODE_SLEEP = 223,
    KEYCODE_SOFT_LEFT = 1,
    KEYCODE_SOFT_RIGHT = 2,
    KEYCODE_SOFT_SLEEP = 276,
    KEYCODE_SPACE = 62,
    KEYCODE_STAR = 17,
    KEYCODE_STB_INPUT = 180,
    KEYCODE_STB_POWER = 179,
    KEYCODE_STEM_1 = 265,
    KEYCODE_STEM_2 = 266,
    KEYCODE_STEM_3 = 267,
    KEYCODE_STEM_PRIMARY = 264,
    KEYCODE_SWITCH_CHARSET = 95,
    KEYCODE_SYM = 63,
    KEYCODE_SYSRQ = 120,
    KEYCODE_SYSTEM_NAVIGATION_DOWN = 281,
    KEYCODE_SYSTEM_NAVIGATION_LEFT = 282,
    KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283,
    KEYCODE_SYSTEM_NAVIGATION_UP = 280,
    KEYCODE_T = 48,
    KEYCODE_TAB = 61,
    KEYCODE_THUMBS_DOWN = 287,
    KEYCODE_THUMBS_UP = 286,
    KEYCODE_TV = 170,
    KEYCODE_TV_ANTENNA_CABLE = 242,
    KEYCODE_TV_AUDIO_DESCRIPTION = 252,
    KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN = 254,
    KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP = 253,
    KEYCODE_TV_CONTENTS_MENU = 256,
    KEYCODE_TV_DATA_SERVICE = 230,
    KEYCODE_TV_INPUT = 178,
    KEYCODE_TV_INPUT_COMPONENT_1 = 249,
    KEYCODE_TV_INPUT_COMPONENT_2 = 250,
    KEYCODE_TV_INPUT_COMPOSITE_1 = 247,
    KEYCODE_TV_INPUT_COMPOSITE_2 = 248,
    KEYCODE_TV_INPUT_HDMI_1 = 243,
    KEYCODE_TV_INPUT_HDMI_2 = 244,
    KEYCODE_TV_INPUT_HDMI_3 = 245,
    KEYCODE_TV_INPUT_HDMI_4 = 246,
    KEYCODE_TV_INPUT_VGA_1 = 251,
    KEYCODE_TV_MEDIA_CONTEXT_MENU = 257,
    KEYCODE_TV_NETWORK = 241,
    KEYCODE_TV_NUMBER_ENTRY = 234,
    KEYCODE_TV_POWER = 177,
    KEYCODE_TV_RADIO_SERVICE = 232,
    KEYCODE_TV_SATELLITE = 237,
    KEYCODE_TV_SATELLITE_BS = 238,
    KEYCODE_TV_SATELLITE_CS = 239,
    KEYCODE_TV_SATELLITE_SERVICE = 240,
    KEYCODE_TV_TELETEXT = 233,
    KEYCODE_TV_TERRESTRIAL_ANALOG = 235,
    KEYCODE_TV_TERRESTRIAL_DIGITAL = 236,
    KEYCODE_TV_TIMER_PROGRAMMING = 258,
    KEYCODE_TV_ZOOM_MODE = 255,
    KEYCODE_U = 49,
    KEYCODE_UNKNOWN = 0,
    KEYCODE_V = 50,
    KEYCODE_VOICE_ASSIST = 231,
    KEYCODE_VOLUME_DOWN = 25,
    KEYCODE_VOLUME_MUTE = 164,
    KEYCODE_VOLUME_UP = 24,
    KEYCODE_W = 51,
    KEYCODE_WAKEUP = 224,
    KEYCODE_WINDOW = 171,
    KEYCODE_X = 52,
    KEYCODE_Y = 53,
    KEYCODE_YEN = 216,
    KEYCODE_Z = 54,
    KEYCODE_ZENKAKU_HANKAKU = 211,
    KEYCODE_ZOOM_IN = 168,
    KEYCODE_ZOOM_OUT = 169,
}

// 设置透明
cc.macro.ENABLE_TRANSPARENT_CANVAS = true

// 管理对象单例
export let JKManager = {
    /**
     * 公共模块
     */
    // 系统配置模块
    get AppConfig() {
        this._AppConfig = this._AppConfig || new AppConfig()

        return this._AppConfig as AppConfig
    },
    get DomainConfig() {
        this._DomainConfig = this._DomainConfig || new DomainConfig()

        return this._DomainConfig as DomainConfig
    },
    // 本地消息分发模块
    get GEventManager() {
        this._GEventManager = this._GEventManager || new GEventManager()

        return this._GEventManager as GEventManager
    },
    // 本地数据存储模块
    get LocalStorage() {
        this._LocalStorage = this._LocalStorage || new LocalStorage()

        return this._LocalStorage as LocalStorage
    },
    // 通用工具模块
    get Utils() {
        this._Utils = this._Utils || new Utils()

        return this._Utils as Utils
    },
    // 音乐音效模块
    get AudioManager() {
        this._AudioManager = this._AudioManager || new AudioManager()

        return this._AudioManager as AudioManager
    },

    /**
     * 非公共模块
     */
    // 常量模块
    Const,
    // 多语言模块
    get Language() {
        this._Language = this._Language || new Language()

        return this._Language as Language
    },
    // 界面管理模块
    get UiManager() {
        this._UiManager = this._UiManager || new UiManager()

        return this._UiManager as UiManager
    },
    // 热更新模块
    get HotUpdate() {
        this._HotUpdate = this._HotUpdate || new HotUpdate()

        return this._HotUpdate as HotUpdate
    },
    // 本地版本对比文件路径
    OriginalManifestUrl: ``,
    // 移动端本地推送模块
    get NativeNotification() {
        this._NativeNotification = this._NativeNotification || new NativeNotification()

        return this._NativeNotification as NativeNotification
    },
    // 移动端相册功能模块
    get AlbumManager() {
        this._AlbumManager = this._AlbumManager || new AlbumManager()

        return this._AlbumManager as AlbumManager
    },
    // 网络模块
    get NetManager() {
        this._NetManager = this._NetManager || new NetManager()

        return this._NetManager as NetManager
    },
    ProtoEnum,
    // 第三方平台管理
    get SocialManager() {
        this._SocialManager = this._SocialManager || new SocialManager()

        return this._SocialManager as SocialManager
    },
    // 用户信息集合管理模块
    get UserInfoManager() {
        this._UserInfoManager = this._UserInfoManager || new UserInfoManager()

        return this._UserInfoManager as UserInfoManager
    },
    // 屏幕旋转控制器
    get ScreenRotationCtrl() {
        this._ScreenRotationCtrl = this._ScreenRotationCtrl || new ScreenRotationCtrl()

        return this._ScreenRotationCtrl as ScreenRotationCtrl
    },

    /**
     * 初始化
     * @param ndUiRoot Ui根节点
     */
    init(ndUiRoot: cc.Node): void {
        cc.log(`JKManager init`)

        JKManager.UiManager.init(ndUiRoot)
        if (!CC_EDITOR) {
            JKManager.Language.init(JKManager.Language.languageCode || cc.sys.languageCode, () => {
                JKManager.UserInfoManager.init()
                JKManager.DomainConfig.checkFastDomain(JKManager.AppConfig.ServerType)
                JKManager.NetManager.init()
                JKManager.GEventManager.init()
                JKManager.ScreenRotationCtrl.init()
                JKManager.AudioManager.init()
                this.NativeNotification.init()
                if (cc.sys.isNative && !cc.sys.isBrowser) {
                    if (cc.sys.os === cc.sys.OS_ANDROID || cc.sys.os === cc.sys.OS_IOS) {
                        this.AlbumManager.init()
                        this.SocialManager.init()
                    }
                }
            })
        }
    },

    onJavaKeyDown(keyCode: JavaKeyCode) {
        cc.log(`JKManager onJavaKeyDown keyCode = ${keyCode}`)

        switch (keyCode) {
            case JavaKeyCode.KEYCODE_BACK:
                this.GEventManager.emit(JKManager.Const.Common.EventType.JavaKeyBack)

                break

            default:
                break
        }
    }
};

(window as any).JKManager = JKManager

CC_EDITOR && JKManager.Language.init(JKManager.Language.languageCode || cc.sys.languageCode)